#ifndef SERVER_H
#define SERVER_H

/**
 * @file server.h
 */

#include <sys/select.h>
#include "lib/client.h"

/**
 * @brief Estrutura central de um servidor
 * 
 * Cuida dos buffers de entrada e saida
 * de seus clientes. Aceita novos clientes
 * e finaliza a de clientes desconectados;
 */
typedef struct server_t {
  int fd; /*! @brief Descritor de arquivo da conexao listener */
  int fdmax; /*! @brief Maior fd armazenado */
  fd_set fdset; /*! todas as conexoes */
  fd_set readset; /*! conexoes prontas para leitura */
  
  int bps; /*! @brief kbps maximo de cada cliente */
  unsigned char frame; /* contagem de frames */
  
  /**
   * @brief Funcao que faz o update nos buffers dos clientes;
   * @param c Cliente em questao
   * @note Nessa funcao voce pode usar os dados nos buffers de entrada e
   * escrever dados no buffer de saida
   */
  int (*update)(client * c);
  int (*quit)(client * c);
  
  /**
   * @brief Lista de clientes. 
   */
  client * clients;
  size_t clientcount;
  
} server;

/**
 * @brief Update server state
 * @param serverp Ponteiro para um servidor
 * @return Tempo de execucao desse loop
 */
int serverupdate(server * serverp);

/**
 * @brief Inicializa um servidor.
 * @param serverp Ponteiro para um servidor
 * @param port Porta de execucao
 * @return 0 se ok, < 0 em erros
 */
int serverinit(server * serverp, int port, size_t kbps);

/**
 * @brief Reconfigura um servidor
 * @param serverp Ponteiro para um servidor
 * @param port Porta (-1 = nao mude)
 * @param kbps Velocidade (-1 = nao mude)
 */
int serverset(server * serverp, int port, size_t kbps);

/**
 * @brief Destroi as estruturas internas de um servidor.
 * @param serverp Ponteiro para um servidor
 * @return 0 se ok, < 0 em erros
 */
int serverdestroy(server * serverp);
  

#endif